#ifndef CLIENTBASE_H
#define CLIENTBASE_H

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdint.h>

#include <iostream>
#include <string.h>
#include <string>

#include "proto.h"
#include "Base.h"
#include "FenetreClient.h"
#include "netUtilClient.h"

using namespace std;

class FenetreClient;

class ClientBase : public QObject, public Base
{
    Q_OBJECT

private:
    FenetreClient *ptrFenetre; // Le pointeur vers la fenetre.

public:
    ClientBase(FenetreClient *ptrFenetre = NULL);
    ~ClientBase();
    bool ouvrirSocket(const char *ip, const char *port); // Ouvre la socket sur une ip et un port. (LANCE UN THREAD)
    void fermerSocket(const QString &cause); // ferme la socket.
    void attendreMessage(); // attend les messages serveur. (éxécuté par le thread lecture).
    void traitementMessage(int idMessage); //trate les messages serveur. (éxécuté par le thread lecture).

    void setPtrFenetre(FenetreClient *ptrFenetre); // affecte le pointeur sur la fenetre.
    bool getConnecte(); // retourne vrai si la socket est connectée, faux sinon.
    const char *getPort(); // retourne le port.
    const char *getIp(); // Retourne l'ip.
    pthread_t getThreadLecture(); // Retourne le thread de lecture socket.

signals:
    void estConnecte(); // Mise à jour de l'état de connexion de la socket (connectée).
    void estDeconnecte(QString); // Mise à jour de l'état de connexion de la socket (déconnectée).
    void sallesRecues(QStringList); // Mise à jour de la liste des salles.
    void activitesRecues(QStringList); // Mise à jour de la liste des activités.
    void sig_lancerActivite(int);
    void sig_arreterActivite(int);
    void sig_nouvelleQuestionQCM(QString, QStringList);
};


#endif // CLIENTBASE_H
